package BL;

import java.io.IOException;
import java.sql.SQLException;
import java.util.EmptyStackException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class centralServlet
 */

public class centralServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public centralServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub

		HttpSession session = request.getSession(true);
		session.setAttribute("fehler", "");
		session.setAttribute("falscherlogin", "");

		String action = request.getParameter("act");

		String kategorieDeleteAction = request
				.getParameter("kategorieDeleteAct");
		if (kategorieDeleteAction != null) {
			kategorieDeleteAction = kategorieDeleteAction.substring(0,
					kategorieDeleteAction.indexOf("l") - 1);

			try {
				AccessDB.deleteKat(kategorieDeleteAction);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				session.setAttribute("fehler",
						"Fehler: Datenbankfehler beim loeschen");

			}

		}

		// ---------------------------------------------------------------------------------------------
		// Ueberpruefen ob Eingabemaske ausreichen befuellt ist
		String suchenAction = request.getParameter("suchenAct");
		if (suchenAction != null) {
			if( request.getParameter("plz")!=null && request.getParameter("ort")!=null && request.getParameter("strasse")!=null && request.getParameter("hausnr")!=null ){
				if( request.getParameter("plz").equals("") && request.getParameter("ort").equals("") ){
					
					session.setAttribute("fehler",
							"Fehler: Postleitzahl oder Ort muss eingegeben werden");
				} else if( request.getParameter("kategorie").equals("Bitte waehlen") || request.getParameter("subKategorie").equals("Bitte waehlen") ){
					
					session.setAttribute("fehler",
							"Fehler: Kategorie und Subkategorie muessen ausgewaehlt werden");
				
			} else {
					action = "ergebnisseite";
					session.setAttribute("plz", request.getParameter("plz"));
					session.setAttribute("ort", request.getParameter("ort"));
					session.setAttribute("strasse", request.getParameter("strasse"));
					session.setAttribute("hausnr", request.getParameter("hausnr"));
					session.setAttribute("kategorie", request.getParameter("kategorie"));
				}
			}
		}
		
		
		// ---------------------------------------------------------------------------------------------
		// Hier wird der Parameter kategorieAct ausgelesen, um eventuelle neue
		// Kategorien Aktionen entgegen zu nehmen
		// Bsp.: Neu Kategorie mit Subkategorie. Neue Subkategorie zu
		// vorhandener Kat, etc
		String kategorieAction = request.getParameter("kategorieAct");
		if (kategorieDeleteAction == null && kategorieAction != null) {
			String txtNeuKat = request.getParameter("neueKategorie");
			String txtNeuSubKat = request.getParameter("neueSubkategorie");

			if (txtNeuKat == null) {
				if (txtNeuSubKat.equals("")) {
					session.setAttribute("fehler",
							"Fehler: Textfeld fuer neue Subkategorie ist leer");
				} else {
					// Neue subkategorie fuer Kategorie anlegen
					try {
						AccessDB.addKat(request.getParameter("kategorien"),
								txtNeuSubKat);
					} catch (EmptyStackException e) {
						// TODO Auto-generated catch block
						session.setAttribute("fehler",
								"Fehler: Kategorie/Subkategorie fuer Kategorie schon vorhanden");
						// e.printStackTrace();
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						session.setAttribute("fehler",
								"Fehler: Fehler Beim Hinzufuegen in die Datenbank");
					}
				}
			} else {
				if (txtNeuKat.equals("") || txtNeuSubKat.equals("")) {
					session.setAttribute("fehler",
							"Fehler: Textfeld fuer Kategorie bzw. Subkategorie ist leer");
				} else {
					// Neue Kategorie mit neuer Subkategorie anlegen
					try {
						AccessDB.addKat(txtNeuKat, txtNeuSubKat);
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						session.setAttribute("fehler",
								"Fehler: Fehler Beim Hinzufuegen in die Datenbank");
					}
				}
			}
		}

		// ---------------------------------------------------------------------------------------------
		// Hier wird der Parameter "eintrAct" ausgelesen, um eventuelle neue
		// Eintraege
		// Aktionen entgegen zu nehmen.
		String eintrAction = request.getParameter("eintrAct");

		if (eintrAction != null) {
			if (eintrAction.equals("Eintrag loeschen")) {
				try {
					AccessDB.deleteEintrag(request.getParameter("eintraege"),
							request.getParameter("subKategorien"));
					//AccessDB.daleteUserVonEintrag((String)request.getParameter("eintraege"));
					session.setAttribute("geloescht", true);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

			if (eintrAction.equals("Eintrag hinzufuegen")) {
				if (request.getParameter("eintr_name") != null
						|| request.getParameter("kategorie") != null
						|| request.getParameter("subKategorie") != null
						|| request.getParameter("lat") != null
						|| request.getParameter("lang") != null
						|| request.getParameter("beschreibung") != null
						|| request.getParameter("bewertung") != null) {
					if (request.getParameter("eintr_name").equals("")
							|| request.getParameter("kategorie").equals(
									"Bitte waehlen")
							|| request.getParameter("subKategorie").equals(
									"Bitte waehlen")
							|| request.getParameter("lat").equals("")
							|| request.getParameter("lang").equals("")
							|| request.getParameter("beschreibung").equals("")
							|| request.getParameter("bewertung").equals("")) {
						session.setAttribute("fehler",
								"Fehler: Bitte überprüfen Sie Ihre Eingaben");
					} else {
						Eintrag eintrag = new Eintrag();
						eintrag.setName(request.getParameter("eintr_name"));
						eintrag.setLat(Double.parseDouble(request
								.getParameter("lat")));
						eintrag.setLang(Double.parseDouble(request
								.getParameter("lang")));
						eintrag.setBeschreibung(request
								.getParameter("beschreibung"));
						eintrag.setBewertung(Integer.parseInt(request
								.getParameter("bewertung")));
						eintrag.setOeffnungszeiten(eintrag
								.erstelleOeffnungszeiten(
										Integer.parseInt(request.getParameter(
												"vvm1").substring(0, 2)
												+ request.getParameter("vvm1")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm1").substring(0, 2)
												+ request.getParameter("bvm1")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm1").substring(0, 2)
												+ request.getParameter("vnm1")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm1").substring(0, 2)
												+ request.getParameter("bnm1")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm2").substring(0, 2)
												+ request.getParameter("vvm2")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm2").substring(0, 2)
												+ request.getParameter("bvm2")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm2").substring(0, 2)
												+ request.getParameter("vnm2")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm2").substring(0, 2)
												+ request.getParameter("bnm2")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm3").substring(0, 2)
												+ request.getParameter("vvm3")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm3").substring(0, 2)
												+ request.getParameter("bvm3")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm3").substring(0, 2)
												+ request.getParameter("vnm3")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm3").substring(0, 2)
												+ request.getParameter("bnm3")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm4").substring(0, 2)
												+ request.getParameter("vvm4")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm4").substring(0, 2)
												+ request.getParameter("bvm4")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm4").substring(0, 2)
												+ request.getParameter("vnm4")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm4").substring(0, 2)
												+ request.getParameter("bnm4")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm5").substring(0, 2)
												+ request.getParameter("vvm5")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm5").substring(0, 2)
												+ request.getParameter("bvm5")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm5").substring(0, 2)
												+ request.getParameter("vnm5")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm5").substring(0, 2)
												+ request.getParameter("bnm5")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm6").substring(0, 2)
												+ request.getParameter("vvm6")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm6").substring(0, 2)
												+ request.getParameter("bvm6")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm6").substring(0, 2)
												+ request.getParameter("vnm6")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm6").substring(0, 2)
												+ request.getParameter("bnm6")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vvm7").substring(0, 2)
												+ request.getParameter("vvm7")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bvm7").substring(0, 2)
												+ request.getParameter("bvm7")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"vnm7").substring(0, 2)
												+ request.getParameter("vnm7")
														.substring(3, 5)),
										Integer.parseInt(request.getParameter(
												"bnm7").substring(0, 2)
												+ request.getParameter("bnm7")
														.substring(3, 5))));
						try {
							AccessDB.addEintrag(eintrag,
									request.getParameter("subKategorie"),
									(String) session.getAttribute("login"));
							AccessDB.addUserZuEintrag(eintrag.getName(), (String)session.getAttribute("login") );
							session.setAttribute("fehler",
									"Erfolgreich Eintrag hinzugefügt");
						} catch (EmptyStackException e) {
							// TODO Auto-generated catch block
							session.setAttribute("fehler",
									"Fehler: Eintrag ist fuer die Kategorie schon vorhanden");
							// e.printStackTrace();
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				} else {
					session.setAttribute("fehler",
							"Fehler: Bitte überpruefen Sie Ihre Eingaben");
				}
			}
		}

		// ---------------------------------------------------------------------------------------------
		// Hier wird der Parameter "UserAct" ausgelesen, um eventuelle neue User
		// Aktionen entgegen zu nehmen.
		// User Hinzufuegen oder User Bearbeiten
		String userAction = request.getParameter("userAct");

		if (userAction != null) {
			if (userAction.equals("User hinzufuegen")) {

				if ((request.getParameter("pwd") == "" )
						|| !(request.getParameter("pwd").equals(request
								.getParameter("pwdWdh")))) {

					session.setAttribute("fehler",
							"Fehler bei der Eingabe: Passwoerter stimmen nicht ueberein oder sind leer");

				} else if( request.getParameter("pwd").length() < 6 ){
					session.setAttribute("fehler",
							"Fehler bei der Eingabe: Passwort mit mindestens 6 Zeichen");
				} else {

					User p = new User(request.getParameter("usr"),
							request.getParameter("pwd"),
							request.getParameter("role"));

					if (p.getUser().equals("")) {
						session.setAttribute("fehler",
								"Fehler bei der Eingabe: User-Feld ist leer");
					} else {
						try {
							AccessDB.addUser(p);
							session.setAttribute(
									"fehler",
									"Erfolgreich registriert. User: "
											+ p.getUser());
						} catch (Exception e) {
							// TODO Auto-generated catch block
							session.setAttribute("fehler",
									"User existiert bereits. Bitte aendern Sie Ihren User-namen");
							e.printStackTrace();
						}
					}
				}

			} else if (userAction.equals("User bearbeiten")) {
				User p = new User(request.getParameter("usr"),
						request.getParameter("pwd"),
						request.getParameter("role"));
				try {
					AccessDB.editUser(p);

				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} else if (userAction.equals("loeschen")) {
				try {
					AccessDB.deleteUser(request.getParameter("usr"));
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

		// ---------------------------------------------------------------------------------------------
		// Hier wird der Parameter "act" ausgelesen, um das "Template" zu
		// fuellen
		// Bestimmung des "contents"

		if ((action == null) || (action.equals("startseite"))) {

			request.setAttribute("content", "startseite.jsp");

		} else if (action.equals("suchen")) {

			request.setAttribute("content", "suchen.jsp");

		} else if (action.equals("kategorieVerwalten")) {

			request.setAttribute("content", "kategorieVerwalten.jsp");

		} else if (action.equals("kategorieVorschlagen")) {

			request.setAttribute("content", "kategorieVorschlagen.jsp");

		} else if (action.equals("eintraegeVerwalten")) {

			request.setAttribute("content", "eintraegeVerwalten.jsp");

		} else if (action.equals("userVerwalten")) {

			request.setAttribute("content", "userVerwalten.jsp");

		} else if (action.equals("registrieren")) {

			request.setAttribute("content", "registrieren.jsp");

		}

		// ---------------------------------------------------------------------------------------------
		String user_name = request.getParameter("name");
		String user_passwort = request.getParameter("passwort");
		boolean angemeldet = false;
		if (user_name != null) {
			if ((user_name.length() != 0) && (user_passwort.length() != 0)) {

				if ((user_name != null) && (user_passwort != null)) {

					if (user_name.length() > 0) {

						User[] usr = null;
						try {
							usr = AccessDB.getUser();
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						for (int i = 0; i < usr.length; i++) {
							if (usr[i].getUser().equals(user_name)
									&& usr[i].getPassword().equals(
											user_passwort)) {

								session.setAttribute("login", user_name);
								session.setAttribute("loginpw", user_passwort);
								session.setAttribute("role", usr[i].getRole());
								angemeldet = true;

							}

						}
					}

					if (angemeldet) {
						session.setAttribute("falscherlogin", "false");
					} else {

						session.setAttribute("falscherlogin", "true");
						session.setAttribute("login", null);
					}
				}

			}

		}

		
		if ((action != null)) {
			if (action.equals("eintragHinzufuegen")) {
				// request.setAttribute("content", "eintragHinzufuegen.jsp");
				RequestDispatcher disp = getServletContext()
						.getRequestDispatcher("/eintragHinzufuegen.jsp");
				disp.forward(request, response);
				return;
			} else if(action.equals("ergebnisseite")){
				RequestDispatcher disp = getServletContext()
						.getRequestDispatcher("/ergebnisseite.jsp");
				disp.forward(request, response);
				return;
			}
		}

		RequestDispatcher disp = getServletContext().getRequestDispatcher(
				"/template.jsp");

		disp.forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
